package com.ytt;

import org.junit.Test;
import org.springframework.util.StringUtils;

import javax.swing.text.html.Option;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static java.lang.Character.isDigit;
import static java.util.Arrays.asList;
import static java.util.stream.Collectors.toList;

public class dome {
    public static void main(String[] args){

        //region "" 示例
//        String name="";
//
//        System.out.println("name==''？？？---"+(name==""));
//        System.out.println(name.isEmpty());
//        System.out.println("nname.equals(\"\")？？？---"+name.equals(""));

        //endregion

        //region null 示例
//        String name=null;
//        System.out.println("name==null-----" + (name==null));
//        System.out.println(name.isEmpty());
//        System.out.println("name.equals(null)------" +(name.equals(null)));
        //region

        // region 工具类
//        System.out.println(StringUtils.isEmpty(null));
//        System.out.println(StringUtils.isEmpty(""));
//        System.out.println(StringUtils.isEmpty("  "));
//        System.out.println(StringUtils.isEmpty("bob"));
        //endregion

        //region Long
//        long age=123456789;
//        long age2=123456789;
//        System.out.println("age==age2----"+(age==age2));
//
//        Long age3=123456789L;
//        Long age4=123456789L;
//        System.out.println("age3==age4------"+(age3==age4));
//
//        System.out.println("age==age3-------"+(age3==age));
//        System.out.println("age3.equals(age)-------"+age3.equals(age));
        //endregion


        //region Optional
//        User user=new User();
//        user.age="12";
//        Optional<User> optionalUser=Optional.of(user);
//
//        // 函数
//        Function<User,String> f= user1 -> {
//            return user1.getName();
//        };
//        System.out.println(optionalUser.map(f).orElse("name"));
//        System.out.println(optionalUser.map(u->u.getAge()).orElse("name"));
//
//        //空User
//        User user1=null;
//        Optional<User> optionalUser1=Optional.ofNullable(user1);
//        System.out.println(optionalUser1.map(u->u.getAge()).orElse("null"));

        //endregion


        //region function 函数式编程：把函数，当参数传来传去
//        Function<String,User> function= name ->{
//            User user=new User();
//            user.setName(name);
//            return user;
//        };
//        new dome().testFunction(function);
        //endregion


        //region lamdba 与 普通方式对比 multiply  乘法
//        final List<BigDecimal> prices = Arrays.asList(new BigDecimal("10"), new BigDecimal("30"), new BigDecimal("17"),
//                new BigDecimal("20"), new BigDecimal("15"), new BigDecimal("18"), new BigDecimal("45"),
//                new BigDecimal("12"));
//
//        // 原来写法
//        List<BigDecimal> newList=new ArrayList<>();
//        for (BigDecimal price:
//                prices ) {
//            if( price.compareTo(BigDecimal.valueOf(20)) > 0){
//                newList.add(price.multiply(BigDecimal.valueOf(0.9)));
//            }
//        }
//        BigDecimal total=BigDecimal.ZERO;
//        for (BigDecimal price :
//                newList) {
//            total=total.add(price);
//        }
//        System.out.println(total);
//
//        //过滤出大于20块的价格，把它们转化成折扣价
//        final BigDecimal totalOfDiscountedPrices = prices.stream()
//                .filter(price -> price.compareTo(BigDecimal.valueOf(20)) > 0)
//                .map(price -> price.multiply(BigDecimal.valueOf(0.9))).reduce(BigDecimal.ZERO, BigDecimal::add); //类名::方法名
//        System.out.println("Total of discounted prices: " + totalOfDiscountedPrices);
        //endregion


        //region collect(toList())
        //方法由 Stream 里的值生成一个列表， 是一个及早求值操作。
        //首先由列表生成一个 Stream ， 然后
        //进行一些 Stream 上的操作， 继而是 collect 操作， 由 Stream 生成列表
//        List<String> collected = Stream.of("a", "b", "c")
//                .collect(Collectors.toList());
//        System.out.println("collected 的第2 个元素"+collected.get(2));

        //endregion

        //region Map
        //方式1.for 循环
//        List<String> oldList=asList("a", "b", "hello");
//
//        List<String> collected = new ArrayList<>();
//        for (String string : oldList) {
//            String uppercaseString = string.toUpperCase();
//            collected.add(uppercaseString);
//        }
//        System.out.println("方式1：");
//        collected.stream().forEach(a->System.out.println(a+""));
//
//        //方式2. Map
//        List<String> col2= oldList.stream().map(a->a.toUpperCase()).collect(Collectors.toList());
//        System.out.println("方式2：");
//        col2.stream().forEach(a->System.out.print(a+","));

        //endregion


        //region filter

        //方法1
//        List<String> oldList=asList("a", "1abc", "abc1");
//        List<String> beginningWithNumbers = new ArrayList<>();
//        for(String value : oldList) {
//            if (isDigit(value.charAt(0))) {
//                beginningWithNumbers.add(value);
//            }
//        }
//        System.out.println("方式1：");
//        beginningWithNumbers.stream().forEach(a->System.out.print(a+","));
//        //方法2
//        List<String> list2=oldList.stream().filter(a->isDigit(a.charAt(0))).collect(Collectors.toList());
//        System.out.println("方式2：");
//        list2.stream().forEach(a->System.out.print(a+","));

        //endregion


        //region flatMap

        List<Integer> together = Stream.of(asList(1, 2), asList(3, 4))
                .flatMap(numbers -> {System.out.println(numbers);return  numbers.stream();})
                .collect(toList());

        //endregion


    }

    public void testFunction(Function<String,User> function){
        User user= function.apply("新");
        System.out.println(user.getName());

    }



}


class User{
    String name;
    String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}
